﻿using System;
using System.Collections;
using System.Diagnostics;
using wdwp.Desktop.widgetLib.CommonTypes;

namespace wdwp.Desktop.Launcher
{
    /// <summary>
    /// 위젯 프로세스 정보 
    /// </summary>
    /*
    public struct sWidgetProc
    {
        public sWidgetInfo SrcInfo;        //위젯 소스 정보         
        private int wPID;              //실행한 위젯 프로세스 정보 

        
        public sWidgetProc(sWidgetInfo srcInfo, int pID)
        {
            SrcInfo = srcInfo;
            wPID = pID;
        }

        public int procId 
        {
            get
            {
                return wPID;            
            }            
        }
     
    };
     * */

    /// <summary>
    /// 실행중인 위젯들을 관리
    /// </summary>
    internal class widgetProcManager
    {
        ArrayList m_arProcList; //프로세스 리스트
        bool m_bWaitUntillQuit;     //위젯이 종료될 때까지 기다릴 것인가?

        /// <summary>
        /// 프로세스 관리자 실행 
        /// </summary>
        public widgetProcManager()
        {
            m_bWaitUntillQuit = true;
            m_arProcList = new ArrayList();
        }

        /// <summary>
        /// 새 위젯 실행 
        /// </summary>
        /// <param name="SrcInfo">위젯을 실행하는데 필요한 소스정보</param>
        /// <returns>정상적으로 위젯이 생성되면 프로세스 반환 아니면 예외발생</returns>
        public Process runNewWidget(sWidgetInfo SrcInfo)
        {
            try
            {
                Process newProc = Process.Start("widgetLoader.exe", SrcInfo.FullHTMLUri);
                             
                m_arProcList.Add(new sWidgetProc(SrcInfo, newProc.Id));
                return newProc;
            }
            catch (Exception exc)
            {
                Debug.WriteLine("Cannot Create a new process : " + exc.ToString());
                throw exc;
            }
         
            //return false;         
        }

        /// <summary>
        /// 위젯 정보로 위젯 프로세스를 죽임 
        /// </summary>
        /// <param name="SrcInfo">위젯 소스 정보</param>
        /// <returns>죽이기에 성공하면 true 아니면 예외와 함께 false</returns>
        public bool killRunWidget(sWidgetInfo srcInfo)
        {
            try
            {
                foreach (sWidgetProc aWdgtProc in m_arProcList)
                {
                    if (aWdgtProc.SrcInfo.Equals(srcInfo))
                    {
                        return killRunWidget(aWdgtProc.procId);
                    }
                }
            }
            catch (Exception exc)
            {
                throw exc;
               
            }

            return false;
        }

        /// <summary>
        /// 위젯 정보로 위젯 프로세스를 죽임 
        /// </summary>
        /// <param name="widgetName">죽이고 싶은 위젯 이름</param>
        /// <returns>죽이기에 성공하면 true 아니면 예외와 함께 false</returns>
        public bool killRunWidget(string widgetName)
        {
            try
            {
                foreach (sWidgetProc aWdgtProc in m_arProcList)
                {
                    if (aWdgtProc.SrcInfo.Name.Equals( widgetName ))
                    {
                        return killRunWidget(aWdgtProc.procId);
                    }
                }
            }
            catch (Exception exc)
            {
                throw exc;
            }

            return false;
        }

        /// <summary>
        /// 위젯 정보로 위젯 프로세스를 죽임
        /// </summary>
        /// <param name="widgetPID">죽이고 싶은 위젯 pID</param>
        /// <returns>죽이기에 성공하면 true 아니면 예외와 함께 false</returns>
        public bool killRunWidget(int widgetPID)
        {
            try
            {
                Process aProcess = Process.GetProcessById(widgetPID);

                if (m_bWaitUntillQuit)
                {
                    aProcess.CloseMainWindow();
                    aProcess.Close();
                }
                else
                {
                    aProcess.Kill();
                }

                return true;
            }
            catch (Exception exc)
            {
                throw exc;
                
            }

            //return false;
        }

        /// <summary>
        /// Process 정보들이 담긴 리스트를 반환 
        /// </summary>
        public ArrayList processList 
        {
            get
            {
                return m_arProcList;
            }            
        }

        /// <summary>
        /// 위젯이 종료될 때까지 기다릴것인지 결정 false로 세팅하면 그냥 죽임 
        /// </summary>
        public bool WaitUntillQuit 
        {
            get
            {
                return m_bWaitUntillQuit;
            }

            set
            {
                m_bWaitUntillQuit = value;
            }
        }


    }



}